import { login as web3Login, logoutWb3, web3State } from '@/utils/web3';
import { showToast, showDialog } from 'vant';
import router from '@/router';
import sessionManager from './sessionManager';

/**
 * 身份验证工具
 * 用于管理用户登录状态和路由拦截
 */
class AuthService {
  /**
   * 检查用户是否已登录
   * @returns {boolean} 是否已登录
   */
  isAuthenticated() {
    return sessionManager.hasValidSession();
  }

  /**
   * 用户登录
   * @param {number} sessionDuration 会话持续时间（毫秒），默认24小时
   * @returns {Promise<boolean>} 登录是否成功
   */
  async login(sessionDuration) {
    // login 函数内部已经处理了保存用户信息的逻辑
    const success = await web3Login();
    return success;
  }

  /**
   * 用户登出
   * @param {boolean} silent 是否静默登出（不显示提示和跳转）
   */
  logout(silent = false) {
    // 清除会话信息
    sessionManager.clearSession();
    // 调用web3登出
    logoutWb3(silent);
  }

  /**
   * 刷新会话
   * @param {number} sessionDuration 会话持续时间（毫秒），默认使用当前设置
   */
  refreshSession(sessionDuration) {
    const session = sessionManager.getSession();
    if (session) {
      sessionManager.refreshSession(session, sessionDuration);
    }
  }

  /**
   * 设置会话过期时间
   * @param {number} hours 小时数
   */
  setSessionDuration(hours) {
    if (typeof hours !== 'number' || hours <= 0) return;
    const milliseconds = hours * 60 * 60 * 1000;
    sessionManager.setExpiryTime(milliseconds);
  }

  /**
   * 获取当前用户信息
   * @returns {Object|null} 用户信息
   */
  getUserInfo() {
    return sessionManager.getUserInfo();
  }

  /**
   * 检查路由是否需要身份验证
   * @param {Object} route 路由对象
   * @returns {boolean} 是否需要身份验证
   */
  routeRequiresAuth(route) {
    
    // 首页不需要身份验证
    if (route.path === '/home' || route.path === '/') {
      return false;
    }

    
    // 明确标记为不需要身份验证的路由
    if (route.meta && route.meta.requiresAuth === false) {
      return false;
    }

    // 默认情况下，所有其他路由都需要身份验证
    return true;
  }

  /**
   * 检查当前登录的钱包地址是否与存储的地址匹配
   * @returns {boolean} 是否匹配
   */
  checkWalletAddressMatch() {
    // 如果未登录，不需要检查
    if (!this.isAuthenticated()) {
      return true;
    }

    // 获取当前用户信息
    const userInfo = this.getUserInfo();
    if (!userInfo || !userInfo.address) {
      return false;
    }

    // 获取当前连接的钱包地址
    const currentAccount = web3State.account;
    if (!currentAccount) {
      return false;
    }

    // 比较地址（不区分大小写）
    return userInfo.address.toLowerCase() === currentAccount.toLowerCase();
  }

  /**
   * 处理需要身份验证的路由
   * @param {Object} to 目标路由
   * @returns {Promise<boolean>} 是否允许导航
   */
  async handleAuthRequired(to) {

    // 如果用户已登录，允许导航
    if (this.isAuthenticated()) {
      return true;
    }

    // 用户未登录，显示登录提示
    try {
      const action = await showDialog({
        title: '需要登录',
        message: '您需要登录才能访问此页面',
        confirmButtonText: '立即登录',
        cancelButtonText: '返回首页',
        showCancelButton: true
      });
      
      if (action === 'confirm') {
        // 用户选择登录
        const loginSuccess = await this.login();
        if (loginSuccess) {
          // 登录成功，允许导航
          return true;
        } else {
          // 登录失败，重定向到首页
          router.replace('/home');
          return false;
        }
      } else {
        // 用户选择返回首页
        router.replace('/home');
        return false;
      }
    } catch (error) {
      console.error('处理身份验证失败:', error);
      router.replace('/home');
      return false;
    }
  }
}

// 创建单例实例
const authService = new AuthService();

export default authService;